const Service = require('egg').Service;

class CategoryService extends Service {
	tableName = 'mock-api-category';
	// 查询
	async queryCategory() {
		const { ctx, app } = this;
		// const productId = ctx.request.header['product-id'];
		/**
         * 产品  -> 表 -> 接口分类 -> 接口
         * 1. 表存入产品id,查询根据产品id
         * 2. 接口分类存入表id,查询根据表id
         * 3. 接口存入接口分类id,查询根据接口分类id
         */
		// 接口分类关联表
		// const _id = app.getObjectId(id);
		// const tableInfo = await app.mongo.findOne('mock-server-table', {
		//    query: {  }
		// })
		// const res = await app.mongo.find(this.tableName, {
		// 	query: {  }
		// });

		// 关联查询
		const res = await app.mongo.aggregate(this.tableName, {
            pipeline: [
                // 聚合顺序一定要注意，字段关联要先在前面转换为一致，所以必须把转换这个放在最前面
                {
					$project: {
						// 把id转为一致的
						parentId: {
							$convert: {
								input: '$parentId',
								to: 'objectId'
                            },
                        },
                        _id: 1,
                        categoryName: 1,
                        desc: 1,
                        createTime: 1,
                        parentName: 1
					}
                },
                
				{
					$lookup: {
						// 关联表
						from: 'mock-server-table',
						// 本表关联字段
						localField: 'parentId', //parentId是字符串，但是外键类型是ObjectId类型的，所以要转换成一致才能关联上
						// 关联表中的关联字段
						foreignField: '_id',
						as: 'list'
					}
                },
                // 拆分数组 $list
                {
                    $unwind: "$list"
                },
                // // 增加字段 新增的字段一定要在$project 声明返回
                {
                    $addFields: {
                        parentName: '$list.name'
                    }
                },
                // 返回字段，以及转换字段类型
				// {
				// 	$match: { all_price: { $gte: 90 } }
				// },
				// {
				// 	$limit: 2
				// }
			],
			// 其它的操作，如：是否为执行查询分析
			options: {}
		});
		return res;
	}
	// 创建接口分类
	async createCategory(data) {
		const { ctx, app } = this;
        const createTime = ctx.helper.getCurrentTime();
        
		const res = await app.mongo.insertOne(this.tableName, {
			doc: { createTime, ...data }
		});
		return res;
	}
	// 更新接口分类
    async updateCategory(data) {
        const { ctx, app } = this;
        const _id = app.getObjectId(data._id);
        const { categoryName, desc, parentId  } = data;
        const res = await app.mongo.findOneAndUpdate(this.tableName, {
            filter: { _id },
            update: {
                $set: { categoryName, desc, parentId }
            }
        });
		return res;
    }
	// 删除接口分类
	async deleteCategory(id) {
		const { ctx, app } = this;
		const _id = app.getObjectId(id);
		// 找到这个分类，看下是否有其他引用，如果有则不能删除
		const table = await app.mongo.findOne(this.tableName, {
			query: { _id }
        });
        // 查看分类所属关联表中是否存在其他引用
		if (table) {
			const tableInfo = await app.mongo.find(table.parentName, {});
			if (tableInfo.length > 0) {
				// 说明有引用，则不能删除
				throw new HttpException(401, '此分类有接口引用，无法删除');
			}
		}
		const res = await app.mongo.findOneAndDelete(this.tableName, {
			filter: { _id }
		});
		return res;
	}
}

module.exports = CategoryService;
